package beans;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.apache.commons.codec.digest.DigestUtils;
import org.primefaces.event.SelectEvent;

import menagement.PacketMgr;
import menagement.UserMgr;
import menagement.dto.EscursioneDTO;
import menagement.dto.HotelDTO;
import menagement.dto.PacketDTO;
import menagement.dto.PrenotazioneDTO;
import menagement.dto.UserDTO;
import menagement.dto.VoloDTO;

@ManagedBean
@SessionScoped
public class UserBean {
	
	@EJB
	private UserMgr userMgr;
	@EJB
	private PacketMgr packetMgr;
	
	private ArrayList<PrenotazioneDTO> prenotazioni;
	private PrenotazioneDTO selezione;
	private VoloDTO voloSelezione;
	private ArrayList<HotelDTO> hotelSelezione;
	private ArrayList<EscursioneDTO> escursioniSelezione;
	private List<PrenotazioneDTO >prenotazioniFiltrate;
	
	//per il modifica profilo
	private UserDTO user;
	private String vecchiaPassword;
	private String password;
	private String password2;
	
	public UserBean(){
		selezione=new PrenotazioneDTO();
		prenotazioni= new ArrayList<PrenotazioneDTO>();
		voloSelezione= new VoloDTO();
		hotelSelezione= new ArrayList<HotelDTO>();
		escursioniSelezione= new ArrayList<EscursioneDTO>();
		prenotazioniFiltrate= new ArrayList<PrenotazioneDTO>();
		user= new UserDTO();
	}
	
	
	
	public List<PrenotazioneDTO> getPrenotazioniFiltrate() {
		return prenotazioniFiltrate;
	}
	public void setPrenotazioniFiltrate(List<PrenotazioneDTO> prenotazioniFiltrate) {
		this.prenotazioniFiltrate = prenotazioniFiltrate;
	}
	public String getVecchiaPassword() {
		return vecchiaPassword;
	}
	public void setVecchiaPassword(String vecchiaPassword) {
		this.vecchiaPassword = vecchiaPassword;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getPassword2() {
		return password2;
	}
	public void setPassword2(String password2) {
		this.password2 = password2;
	}
	public UserDTO getUser() {
		return user;
	}
	public void setUser(UserDTO user) {
		this.user = user;
	}


	public PrenotazioneDTO getSelezione() {
		return selezione;
	}


	public void setSelezione(PrenotazioneDTO selezione) {
		this.selezione = selezione;
	}


	public ArrayList<PrenotazioneDTO> getPrenotazioni() {
		return prenotazioni;
	}
	public void setPrenotazioni(ArrayList<PrenotazioneDTO> prenotazioni) {
		this.prenotazioni = prenotazioni;
	}
	
	public VoloDTO getVoloSelezione() {
		return voloSelezione;
	}
	public void setVoloSelezione(VoloDTO voloSelezione) {
		this.voloSelezione = voloSelezione;
	}

	public ArrayList<HotelDTO> getHotelSelezione() {
		return hotelSelezione;
	}
	public void setHotelSelezione(ArrayList<HotelDTO> hotelSelezione) {
		this.hotelSelezione = hotelSelezione;
	}
	
	public ArrayList<EscursioneDTO> getEscursioniSelezione() {
		return escursioniSelezione;
	}
	public void setEscursioniSelezione(ArrayList<EscursioneDTO> escursioniSelezione) {
		this.escursioniSelezione = escursioniSelezione;
	}


	public String getName() {
		return userMgr.getUserDTO().getFirstName();
	}
	public String getMail(){
		return userMgr.getUserDTO().getEmail();
	}
	
	public void visualizzaPrenotazioni(){
		prenotazioni= packetMgr.travaPrenotazioni(this.getMail());
	}
	
	public void onRowSelect(SelectEvent event){
		System.out.println("Punto 1");
		System.out.println(selezione.getIdPrenotazione());
		System.out.println(selezione.getCodiceVolo());
		voloSelezione=packetMgr.getVolo(selezione.getCodiceVolo());
		System.out.println("Punto 2");
		hotelSelezione=packetMgr.listaHotelPrenotazione(((PrenotazioneDTO) event.getObject()).getIdPrenotazione());
		System.out.println("Punto 3");
		escursioniSelezione= packetMgr.listaEscursioniPrenotazione(((PrenotazioneDTO) event.getObject()).getIdPrenotazione());
		System.out.println("Fine");
	}
	
	public void populate(){
		user=userMgr.getUserDTO();
	}
	
	public String modificaUser(){
		System.out.println("Sono dentro");
		System.out.println(vecchiaPassword);
		if(!vecchiaPassword.isEmpty()){ //prima controllo che abbbia inserito qualcosa in vecchia password
			System.out.println("Punto 1");
			vecchiaPassword=DigestUtils.sha256Hex(vecchiaPassword);
			if(!(vecchiaPassword.equals(user.getPassword()))){
				System.out.println(vecchiaPassword);
				System.out.println(user.getPassword());
				FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"La password inserita non coincide con la precedente", "");
		        FacesContext.getCurrentInstance().addMessage(null, msg);
			}
			else{ //se quella vecchia non e vuota controllo la password nuova
				if(password.isEmpty()){
					FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"Inserire una nuova password", "");
			        FacesContext.getCurrentInstance().addMessage(null, msg);
				}
				else{
					if(password2.isEmpty()){
						FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"La conferma non puo essere vuota", "");
				        FacesContext.getCurrentInstance().addMessage(null, msg);
					}
					else{
						if(!(password.equals(password2))){
							FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"Le password inserite non coincidono", "");
					        FacesContext.getCurrentInstance().addMessage(null, msg);
						}
						else{
							user.setEmail(userMgr.getUserDTO().getEmail());
							user.setPassword(password);
							userMgr.update(user, true);// true perche' qua la password e' da modificare
							FacesMessage msg = new FacesMessage("Modifiche apportate con successo", "");
					        FacesContext.getCurrentInstance().addMessage(null, msg);
					        return "index?faces-redirect=true";
						}
					}
					
				}
				
			}
		}
		else{
			if((!password.isEmpty()) || (!password2.isEmpty())){
				FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"Se si vuole cambiare password, prima inserire quella vecchia", "");
		        FacesContext.getCurrentInstance().addMessage(null, msg);
			}
			else{
				userMgr.update(user, false); //false perche' qua la password NON e' da modificare
				FacesMessage msg = new FacesMessage("Modifiche apportate con successo", "");
		        FacesContext.getCurrentInstance().addMessage(null, msg);
		        return "index?faces-redirect=true";
			}
				
				
		}
		return null;
		
	}
	
}

